package com.xyebank.cn.project.util;

import com.xyebank.cn.project.entity.CreateInfo;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

/**
 * 代码生成器工具
 */
public class CreateCodeUtil {

    public  static  final  String pomFileName="pom.xml";

    public static final  String  appName="Application.java";

    public static final  String  propertiesName="application.properties";

    public static final  String  testName="ApplicationTests.java";


    /**
     * 生成application
     * @param temp 模板
     * @param createInfo  提交的信息
     * @param uploadPath  生成文件路径
     */
    public static void createApplication(Template temp, CreateInfo createInfo, String uploadPath) {
        String groupId=createInfo.getGroupId();
        String groupPath=groupId.replace(".","/");
        String appPath=uploadPath+"/src/main/java/"+groupPath+"/";
        checkParentFilePath(appPath);
        createFile(temp, createInfo, appPath+appName);

    }


    /**
     * 生成pom项目
     * @param template 模板
     * @param createInfo  提交的信息
     * @param projPath  生成文件路径
     */
    public static void createPom(Template template, CreateInfo createInfo, String projPath) {
        createFile(template, createInfo, projPath+pomFileName);
    }

    /**
     * 生成properties
     * @param template 模板
     * @param createInfo  提交的信息
     * @param projPath  生成文件路径
     */
    public static void createProperties(Template template, CreateInfo createInfo, String projPath) {
        String propertiesPath=projPath+"/src/main/resources/";
        checkParentFilePath(propertiesPath);
        createFile(template, createInfo, propertiesPath+propertiesName);
    }

    /**
     * 生成test模板
     * @param template 模板
     * @param createInfo  提交的信息
     * @param projPath  生成文件路径
     */
    public static void createTest(Template template, CreateInfo createInfo, String projPath) {
        String groupId=createInfo.getGroupId();
        String groupPath=groupId.replace(".","/");
        String testPath=projPath+"/src/test/java/"+groupPath+"/";
        checkParentFilePath(testPath);
        createFile(template, createInfo, testPath+testName);

    }



    /**
     * 创建文件
     * @param temp 模板
     * @param createInfo  创建信息
     * @param fileName  生成的文件路径
     */
    private static void createFile(Template temp, CreateInfo createInfo, String fileName) {
        Writer file =null;
        try {

            file = new FileWriter(fileName);
            temp.process(createCreateInfoMap(createInfo), file);
            file.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            try {
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }



    /**
     * 效验父目录是否存在
     * @param rootPath
     */
    public static void checkParentFilePath(String rootPath) {
        File file=new File(rootPath);
        if (!file.exists()) {
            file.mkdirs();
        }
    }


    /**
     * 将提交对象转换成map
     * @param createInfo
     * @return
     */
    private static Map<String, String> createCreateInfoMap(CreateInfo createInfo) {
        Map<String,String> createMap=new HashMap<>();
        createMap.put("groupId",createInfo.getGroupId());
        createMap.put("artifactId",createInfo.getArtifact());
        createMap.put("dockerUrl",createInfo.getDockerUrl());
        createMap.put("modelName",createInfo.getModelName());
        createMap.put("host",createInfo.getServerName());
        createMap.put("port",createInfo.getPort());
        return createMap;
    }



}


